﻿/*! @file
********************************************************************************
<PRE>
文 件 名    : BaseSlnFile.cs
说    明    : 转换 解决方案文件 基类
作    者    : 汪泽然
--------------------------------------------------------------------------------
备    注    : 
--------------------------------------------------------------------------------
修改记录: 
 * 日    期    版  本    修改人    修改内容 
 * 2009-7-9    0.5.0     汪泽然    完成基本转换功能
</PRE>
********************************************************************************
* 版权所有(c) 2008 ~ 2009, 汪泽然, 保留所有权利
*******************************************************************************/
using System;
using System.Text;
using System.Collections.Generic;
using System.Text.RegularExpressions;

using Wangzeran.Transform.Core.Util;
using Wangzeran.Transform.Core.TransformException;
using Wangzeran.Transform.Core.ITransform;

namespace Wangzeran.Transform.Core.Support
{
    /// <summary>
    /// 转换 解决方案文件 的基类
    /// </summary>
    public abstract class BaseSlnFile : BaseChildFiles, ITransformFile
    {

        #region Common Variables

        /// <summary>
        /// 匹配解决方案格式
        /// </summary>
        /// <remarks>
        /// Microsoft Visual Studio Solution File, Format Version xx.xx
        /// </remarks>
        private const string COMMON_PATTERN_VERSION = @"Microsoft Visual Studio Solution File, Format Version (\d.+)\b";
        /// <summary>
        /// 匹配IDE版本格式
        /// </summary>
        /// <remarks>
        /// # Visual Studio xxxx
        /// </remarks>
        private const string COMMON_PATTERN_IDE = @"#.*\S";
        /// <summary>
        /// 替换解决方案格式
        /// </summary>
        /// <remarks>
        /// Microsoft Visual Studio Solution File, Format Version 
        /// </remarks>
        private const string COMMON_REPLACE_VERSION =
            @"Microsoft Visual Studio Solution File, Format Version ";

        #endregion


        #region Common Properties

        /// <summary>
        /// 当前解决方案的IDE版本
        /// </summary>
        protected abstract string CURRENT_IDE_VERSION { get; }
        /// <summary>
        /// 当前解决方案的数字版本
        /// </summary>
        protected abstract string CURRENT_NUM_VERSION { get; }
        /// <summary>
        /// 当前解决方案的完整数字版本
        /// </summary>
        protected virtual string CURRENT_REPLACE_NUM_VERSION
        {
            get
            {
                return COMMON_REPLACE_VERSION.Trim() + " " + CURRENT_NUM_VERSION.Trim();
            }
        }
        /// <summary>
        /// 当前解决方案的完整IDE版本
        /// </summary>
        protected virtual string CURRENT_REPLACE_IDE_VERSION
        {
            get
            {
                return "# " + CURRENT_IDE_VERSION.Trim();
            }
        }

        #endregion


        #region IBaseFile 成员

        /// <summary>
        /// 获取当前解决方案文件的版本信息
        /// </summary>
        /// <param name="filePath">文件完整路径</param>
        /// <returns></returns>
        /// <exception cref="UnGetVersionException">无法获取文件版本的异常</exception>
        public virtual string GetVersion(string filePath)
        {
            try
            {
                string content = TransformUtil.GetFileContent(filePath);

                // 获取解决方案版本和IDE版本
                // Microsoft Visual Studio Solution File, Format Version xx.xx
                string matchVersion = Regex.Match(content,
                    COMMON_PATTERN_VERSION, RegexOptions.IgnoreCase).ToString();
                // # Visual Studio xxxx
                string matchIde = Regex.Match(content,
                    COMMON_PATTERN_IDE, RegexOptions.IgnoreCase).ToString();

                // 替换版本字符串中的公共部分，下面是替换后的结果
                // xx.xx
                string Version = Regex.Replace(matchVersion,
                    COMMON_REPLACE_VERSION, String.Empty, RegexOptions.IgnoreCase).Trim();
                // Visual Studio xxxx
                string Ide = matchIde.Remove(0, 1).Trim();

                if (Version == CURRENT_NUM_VERSION && Ide == CURRENT_IDE_VERSION)
                {
                    return this.CURRENT_IDE_VERSION;
                }
                else
                {
                    return Ide;
                }
            }
            catch (Exception ex)
            {
                throw new UnGetVersionException(filePath, ex.Message);
            }
        }

        /// <summary>
        /// 检查当前文件的版本是否为当前版本，如果是，则不进行转换，如果否，则可以进行转换
        /// </summary>
        /// <param name="filePath">解决方案文件完整路径</param>
        /// <returns>True: 非当前版本 False:当前版本</returns>
        /// <exception cref="IsCurrentVersionException">当前文件版本已经是转换目标版本的异常</exception>
        /// <exception cref="UnGetVersionException">无法获取文件版本的异常</exception>
        public virtual bool IsDiffVersion(string filePath)
        {
            try
            {
                string version = GetVersion(filePath);

                if (version != this.CURRENT_IDE_VERSION)
                {
                    return true;
                }
                else
                {
                    throw new IsCurrentVersionException(filePath);
                }
            }
            catch (IsCurrentVersionException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw new UnGetVersionException(filePath, ex.Message);
            }
        }

        /// <summary>
        /// 转换解决方案文件
        /// </summary>
        /// <param name="filePath">解决方案文件完整路径</param>
        /// <returns>True：转换成功 False：转换失败</returns>
        /// <exception cref="BaseException"></exception>
        /// <exception cref="TransformFailureException">转换失败的异常</exception>
        public virtual bool Transform(string filePath)
        {
            try
            {
                // 解决方案文本（Unicode编码）
                string content = TransformUtil.GetFileContent(filePath); ;

                if (IsDiffVersion(filePath))
                {
                    // 替换 Microsoft Visual Studio Solution File, Format Version xx.xx
                    content = Regex.Replace(content,
                        COMMON_PATTERN_VERSION, CURRENT_REPLACE_NUM_VERSION, RegexOptions.IgnoreCase);

                    // 替换 # Visual Studio xxxx
                    content = Regex.Replace(content,
                        COMMON_PATTERN_IDE, CURRENT_REPLACE_IDE_VERSION, RegexOptions.IgnoreCase);
                }

                TransformUtil.WriteFileContent(filePath, content);

                return true;
            }
            catch (BaseException ex)
            {
                throw ex;
            }
            catch (Exception ex)
            {
                throw new TransformFailureException(filePath, ex.Message);
            }
        }

        #endregion

    }
}
